Описание
Задает или возвращает число записей, загруженных из источника
данных ODBC, которых следует поместить в локальный буфер.
Значение
Задаваемое или возвращаемое значение имеет тип данных Long
и должно находиться в пределах от 5 до 1200, но не превышать объем доступной
памяти. Типичным значением данного свойства является число 100. Значение 0
отключает буфер.
Замечания
Помещение данных в локальный буфер повышает быстродействие при
использовании объектов Recordset для загрузки данных с удаленного
сервера. Буфером называется область локальной памяти, содержащая данные, которые
были получены с сервера во время последних обращений. Данные заносятся в
локальный буфер в предположении, что во время выполнения приложения потребуется
повторное обращение к этим данным. Во время обращения к данным ядро базы данных
Microsoft Jet сначала проверяет наличие данных в локальном буфере вместо
обращения к серверу, которое занимает намного больше времени. В локальном буфере
сохраняются только данные, поступающие из источника данных ODBC.
Любой
источник данных ODBC, подключенный к ядру Microsoft Jet, такой как
присоединенная таблица, может иметь собственный локальный буфер. Для создания
локального буфера следует открыть объект Recordset на основе удаленного
источника данных, задать значения свойств CacheSize и CacheStart,
а затем вызвать метод FillCache или осуществить переходы по записям с
помощью методов группы Move.
Для источника данных ODBCDirect
также поддерживается использование локального буфера. Для создания буфера
следует определить свойство CacheSize объекта QueryDef. Для
объекта Relation свойство CacheSize доступно только для чтения и
определяется значением свойства CacheSize объекта QueryDef. В
рабочей области ODBCDirect невозможно использовать свойство
CacheStart в методе FillCache.
Выбор значения свойства
CacheSize основывается на числе записей, с которыми приложение может
работать одновременно. Например, если объект Recordset используется как
источник данных для вывода на экран, удобно задать для свойства CacheSize
значение 20 для сохранения в буфере 20 одновременно выводимых на экран
записей.
Записи, которые помещены в локальный буфер, принимаются ядром базы
данных Microsoft Jet непосредственно из буфера, а записи вне этого
диапазона загружаются с сервера.
Записи, полученные из локального буфера, не
отражают изменений, внесенных в источник данных другими пользователями со
времени записи данных в буфер.
Для принудительного обновления содержимого
локального буфера следует задать значение 0 для свойства CacheSize
объекта Recordset, а затем восстановить первоначальное значение размера
буфера и вызвать метод FillCache.
Пример
В данном примере методы CreateTableDef и FillCache и
свойства CacheSize, CacheStart и SourceTableName
используются, чтобы дважды перебрать все записи в присоединенной таблице, первый
раз без временного буфера и второй с временным буфером на 50 записей. Далее
выводятся статистические данные о выполнении этой операции с временным буфером и
без него.
Sub ClientServerX3()
Dim dbsCurrent As Database
Dim tdfRoyalties As TableDef
Dim rstRemote As Recordset
Dim sngStart As Single
Dim sngEnd As Single
Dim sngNoCache As Single
Dim sngCache As Single
Dim intLoop As Integer
Dim strTemp As String
Dim intRecords As Integer
' Открывает базу данных, в которую будет добавлена
' присоединенная таблица.
Set dbsCurrent = OpenDatabase("DB1.mdb")
' Создает таблицу, присоединенную к базе данных
' Microsoft SQL Server.
Set tdfRoyalties = dbsCurrent.CreateTableDef("Отчисления")
tdfRoyalties.Connect = "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"
tdfRoyalties.SourceTableName = "roysched"
dbsCurrent.TableDefs.Append tdfRoyalties
Set rstRemote = dbsCurrent.OpenRecordset("Отчисления")
With rstRemote
' Дважды перебирает записи в объекте Recordset
' и определяет затраченное время.
sngStart = Timer
For intLoop = 1 To 2
.MoveFirst
Do While Not .EOF
' Выполняет простую операцию
' для проверки быстродействия.
strTemp = !title_id
.MoveNext
Loop
Next intLoop
sngEnd = Timer
sngNoCache = sngEnd - sngStart
' Помещает в буфер первые 50 записей.
.MoveFirst
.CacheSize = 50
.FillCache
sngStart = Timer
' Дважды перебирает записи в объекте Recordset
' и определяет затраченное время.
For intLoop = 1 To 2
intRecords = 0
.MoveFirst
Do While Not .EOF
' Выполняет простую операцию
' для проверки быстродействия.
strTemp = !title_id
' Подсчитывает записи. Если достигнут конец
' буфера, то в буфер помещаются
' следующие 50 записей.
intRecords = intRecords + 1
.MoveNext
If intRecords Mod 50 = 0 Then
.CacheStart = .Bookmark
.FillCache
End If
Loop
Next intLoop
sngEnd = Timer
sngCache = sngEnd - sngStart
' Выводит результаты.
MsgBox "Сравнение результатов:" & vbCr & " Без буфера: " & Format(sngNoCache, _
"##0.000") & " секунд" & vbCr & " С буфером на 50 записей: " & Format(sngCache, _
"##0.000") & " секунд"
.Close
End With
' Удаляет присоединенную таблицу, созданную для демонстрации.
dbsCurrent.TableDefs.Delete tdfRoyalties.Name
dbsCurrent.Close
End Sub